package com.neusoft.utils;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.multipart.MultipartFile;

public class MyUtil {
	/**
	 * log4j日志对象
	 */
	public static Log logRootLogger = LogFactory.getLog("rootLogger");

	/**
	 * ssm框架中的文件上传处理
	 * 
	 * @param uploadFile
	 *            上传的文件对象
	 * @param request
	 *            请求对象
	 * @param fileDirectoryName
	 *            保存文件的文件夹，例如：adminImgs/（后面的/不能少）.\
	 *            默认存储的路径是："static/uploadFiles/"+fileDirectoryName
	 * @param filePrefix
	 *            文件的前缀，例如：adminImg_。文件的命名规则：前缀+uuid
	 * @param clazzT
	 *            保存文件路径的实体bean对象
	 */
	public static <T> void uploadSingleFile(MultipartFile uploadFile, HttpServletRequest request,
			String fileDirectoryName, String filePrefix, T clazzT) {
		// 获取到MultipartFile文件对象以后，进行文件上传处理
		if (uploadFile != null && uploadFile.getSize() > 0) {
			// 1、在web服务器上创建保存该文件的目录文件夹
			// 获取服务器的路径
			String strContentPath = request.getSession().getServletContext().getRealPath("/");
			// 保存上传文件的路径,注意如果进行静态资源过滤，该路径需要进行静态资源解析
			// adminImgs/
			String strRelativePath = "static/uploadFiles/" + fileDirectoryName;
			// 创建上窜文件的目录
			File fileDirectory = new File(strContentPath + strRelativePath);
			// 判断该目录是否存在，如果不存在，则创建该目录
			if (fileDirectory != null && fileDirectory.exists()) {
			} else {
				// 创建目录
				fileDirectory.mkdirs();
			}
			// 2、上传文件流
			// 提取上传文件的后缀名
			// 就文件名
			String strOldName = uploadFile.getOriginalFilename();
			String strFileType = strOldName.substring(strOldName.lastIndexOf("."));
			// 生成上传文件的文件名
			// "adminImg_"
			String strNewFileName = filePrefix + UUID.randomUUID().toString() + strFileType;
			try {
				// 上传文件
				uploadFile.transferTo(new File(strContentPath + strRelativePath + strNewFileName));
				// 给实体bean进行属性赋值
				// 3、将文件路径赋值给实体bean的文件成员变量，然后同实体bean一起讲文件路径保存在数据库中
				// 获取文件控件的name属性值
				String strName = uploadFile.getName();
				// 根据约定的规则提取实体bean的属性名：约定file控件的name属性名为：前缀file_实体bean的属性名(注意前缀不能改变，因为action中使用)
				String strPropName = strName.replaceFirst("file_", "").trim();
				// 使用beanUtil设置实体bean的属性
				BeanUtils.setProperty(clazzT, strPropName, strRelativePath + strNewFileName);
			} catch (Exception e) {
				// 文件上传异常
				MyUtil.logRootLogger.info("文件上传异常：" + e.getMessage());
				// 输出异常信息
				e.printStackTrace();
			}
		}
	}

	/**
	 * 判定对象是否为空或者null
	 * 
	 * @param obj
	 *            被判定的对象
	 * @return 判定结果（true：不为空且不为null；false：为空或者为null）
	 */
	public static boolean isNotNVLOrEmpty(Object obj) {
		// 默认为false，即结果为空或者是null
		boolean is_re = false;
		if (obj != null && !obj.equals("")) {
			is_re = true;
		}
		return is_re;
	}

	/**
	 * 工厂方法：获取指定Class的实例对象
	 * 
	 * @param <T>
	 *            泛型的Class
	 * 
	 * @return 实例对象
	 */
	public static <T> T getNewInstance(Class<T> clazz) {
		T tClazz = null;
		try {
			tClazz = clazz.newInstance();
		} catch (Exception e) {
			// 使用反射创建实例对象异常
			MyUtil.logRootLogger.info("使用反射创建Class实例对象异常:" + e.getMessage());
		}
		return tClazz;
	}

	/**
	 * 将字符串转换为Integer类型（转换异常返回值为null）
	 * 
	 * @param strVal
	 *            被转换的字符串
	 * @return 转换之后的值
	 */
	public static Integer convertString2Integer(String strVal) {
		Integer val = null;
		try {
			if (strVal != null && !strVal.equals("")) {
				val = Integer.parseInt(strVal);
			}
		} catch (Exception e) {
			MyUtil.logRootLogger.info("将字符串转换为日期异常：" + e.getMessage());
		}
		return val;
	}

	/**
	 * 将时间字符串转换为时间对象(如果转换失败，则返回null)
	 * 
	 * @param strDate
	 *            时间字符串
	 * @param pattern
	 *            时间字符串strDate的格式
	 * @return 转换的时间对象
	 */
	public static Date convertString2Date(String strDate, String pattern) {

		// 默认返回值
		Date date = null;
		// Date date = new Date();
		try {
			if (isNotNVLOrEmpty(strDate)) {
				// 创建一个date的格式化类
				SimpleDateFormat sdf = new SimpleDateFormat(pattern);
				// 将date转换为指定格式的字符串
				date = sdf.parse(strDate);
			}
		} catch (Exception e) {
			// 转换失败，返回默认值
			System.out.println("字符串转换时间对象失败，返回null值");
		}
		// 返回
		return date;
	}

	/**
	 * Date转换为字符串
	 * 
	 * @param date
	 *            被转换的Date类型
	 * @param pattern
	 *            转换的目标字符串的格式
	 * @return 转之后的字符串
	 */
	public static String convertDate2String(Date date, String pattern) {
		// 设定默认格式
		if (pattern == null || pattern.equals("")) {
			pattern = "yyyy-MM-dd";
		}
		// 默认返回值
		String strDate = null;
		if (date != null) {
			// 创建一个date的格式化类
			SimpleDateFormat sdf = new SimpleDateFormat(pattern);
			// 将date转换为指定格式的字符串
			strDate = sdf.format(date);
		}
		// 返回
		return strDate;
	}

}
